/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.arca.documento.electronico.webservice.envio;

import com.arca.documento.electronico.webservice.recepcion.Comprobante;
import com.arca.documento.electronico.webservice.recepcion.Mensaje;
import com.arca.documento.electronico.webservice.recepcion.RecepcionComprobantes;
import com.arca.documento.electronico.webservice.recepcion.RecepcionComprobantesService;
import com.arca.documento.electronico.webservice.recepcion.RespuestaSolicitud;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceException;
import org.apache.log4j.Logger;

/**
 *
 * @author use12
 */
public class EnvioDocumentoElectronicoWS {

    static final Logger logger = Logger.getLogger(EnvioDocumentoElectronicoWS.class);
    private static RecepcionComprobantesService service;
    private static final String VERSION = "1.0.0";
    public static final String RECIBIDA = "RECIBIDA";
    public static final String DEVUELTA = "DEVUELTA";

    public EnvioDocumentoElectronicoWS(String wsdlLocation)
            throws MalformedURLException, WebServiceException {
        URL url = new URL(wsdlLocation);
        QName qname = new QName("http://ec.gob.sri.ws.recepcion", "RecepcionComprobantesService");
        service = new RecepcionComprobantesService(url, qname);
    }

    public static final Object webService(String wsdlLocation) {
        try {
            QName qname = new QName("http://ec.gob.sri.ws.recepcion", "RecepcionComprobantesService");
            URL url = new URL(wsdlLocation);
            service = new RecepcionComprobantesService(url, qname);
            return null;
        } catch (MalformedURLException ex) {
            logger.error(ex, ex);
            return ex;
        } catch (WebServiceException ws) {
            logger.error(ws, ws);
            return ws;
        }
    }

    //Uno por uno
    public RespuestaSolicitud enviarDocumento(String ruc, File xmlFile,
            String tipoDocumento, String versionXsd) {
        RespuestaSolicitud solicitud = null;
        try {
            RecepcionComprobantes port = service.getRecepcionComprobantesPort();
            //Aqui obtenemos el archivo xml
            //ArchivoUtils.archivoToByte(xmlFile)
            byte[] bxml = null;
            solicitud = port.validarComprobante(bxml);
        } catch (Exception e) {
            logger.error(e, e);
            solicitud = new RespuestaSolicitud();
            solicitud.setEstado(e.getMessage());
        }
        return solicitud;
    }
    //Por Lotes
    public RespuestaSolicitud enviarDocumentos(String ruc, byte[] xml, String tipoComprobante, 
            String versionXsd) {
        RespuestaSolicitud solicitud = null;
        try {
            RecepcionComprobantes port = service.getRecepcionComprobantesPort();
            solicitud = port.validarComprobante(xml);
        } catch (Exception e) {
            logger.error(e, e);
            solicitud = new RespuestaSolicitud();
            solicitud.setEstado(e.getMessage());
        }
        return solicitud;
    }
    //Por Lotes
    public RespuestaSolicitud enviarDocumentos(String ruc, File xml, String tipoComprobante, 
            String versionXsd) {
        RespuestaSolicitud solicitud = null;
        try {
            RecepcionComprobantes port = service.getRecepcionComprobantesPort();
            //ArchivoUtils.archivoToByte(xml)
            byte[] bxml = null;
            solicitud = port.validarComprobante(bxml);
        } catch (Exception e) {
            logger.error(e, e);
            solicitud = new RespuestaSolicitud();
            solicitud.setEstado(e.getMessage());
        }
        return solicitud;
    }

    public static RespuestaSolicitud obtenerRespuestaEnvio(File archivo, String ruc, 
            String tipoDocumento, String claveDeAcceso, String urlWsdl) {
        RespuestaSolicitud respuesta = new RespuestaSolicitud();
        EnvioDocumentoElectronicoWS cliente = null;
        try {
            cliente = new EnvioDocumentoElectronicoWS(urlWsdl);
            respuesta = cliente.enviarDocumento(ruc, archivo, tipoDocumento, VERSION);
        } catch (Exception ex) {
            logger.error(ex, ex);
            respuesta.setEstado(ex.getMessage());
        }
        return respuesta;
    }

    public static void guardarRespuesta(String claveDeAcceso, String archivo, String estado, 
            java.util.Date fecha) {
//        try {
//            java.sql.Date sqlDate = new java.sql.Date(fecha.getTime());
//
//            Respuesta item = new Respuesta(null, claveDeAcceso, archivo, estado, sqlDate);
//            RespuestaSQL resp = new RespuestaSQL();
//            resp.insertarRespuesta(item);
//        } catch (Exception ex) {
//            Logger.getLogger(EnvioComprobantesWs.class.getName()).log(Level.SEVERE, null, ex);
//        }
    }

    public static String obtenerMensajeRespuesta(RespuestaSolicitud respuesta) {
        StringBuilder mensajeDesplegable = new StringBuilder();
        if (respuesta.getEstado().equals(DEVUELTA) == true) {
            RespuestaSolicitud.Comprobantes documentos = respuesta.getComprobantes();
            for (Comprobante comp : documentos.getComprobante()) {
                mensajeDesplegable.append(comp.getClaveAcceso());
                mensajeDesplegable.append("\n");
                for (Mensaje m : comp.getMensajes().getMensaje()) {
                    mensajeDesplegable.append(m.getMensaje()).append(" :\n");
                    mensajeDesplegable.append(m.getInformacionAdicional() != null ? m.getInformacionAdicional() : "");
                    mensajeDesplegable.append("\n");
                }
                mensajeDesplegable.append("\n");
            }
        }

        return mensajeDesplegable.toString();
    }
}
